package si.yun.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import si.yun.dao.*;
import si.yun.entity.*;
import si.yun.service.syForumSe;
import si.yun.utils.CacheKeyManager;
import si.yun.utils.GuavaUtils;
import si.yun.utils.KeyWordFilter;
import si.yun.utils.TestAliUpload;

import java.util.*;

/**
 *  @ClassName: 课程实现类
 *  @Description: TODO 
 *  @Author: 张雨薇
 *  @Date 2021/7/29 15:44
 */
@Service
@PropertySource("classpath:config.properties")
public class syForumImpl implements syForumSe {
   @Value("${path1}")
    private String path1;

    @Autowired
    private SyForumMapper dao;

    @Autowired
    private SyCourseMapper syCourseMapper;

    @Autowired
    private GuavaUtils baseCache;

    @Autowired
    private SyActicleCategrayMapper syActicleCategrayMapper;

    @Autowired
    public SyCommentMapper syCommentMapper;

    @Autowired
    private PersonnelDao personnelMapper;

    @Autowired
    public TestAliUpload testAliUpload;

    /**
      * @Author : 张雨薇
      * @Date : 2021/7/29 15:46
      * @Param : [actid]
      * @Return : java.util.List<si.yun.entity.SyForum>
      */
    @Override
    public List<SyForum> seForum(Map<String,Object> map) {
        List<SyForum> syForums = dao.seForum(map);
        return syForums;
    }


    /**
      * @Author : 张雨薇
      * @Date : 2021/7/29 19:25
      * @Param : [microcircleId]
      * @Return : int
      */
    @Override
    public int deleteByPrimaryKey(Integer microcircleId) {
        int i = dao.deleteByPrimaryKey(microcircleId);
        return i;
    }

    /**
      * @Author : 张雨薇
      * @Date : 2021/8/1 19:37
      * @Param : [fid]
      * @Return : si.yun.entity.SyForum
      */
    @Override
    public List<SyForum> seForumTab(Integer fid) {
        List<SyForum> syForum = dao.seForumTab(fid);
        return syForum;
    }

    /**
      * @Author : 评论信息
      * @Date : 2021/8/2 17:16
      * @Param : [forumid, limitnum]
      * @Return : java.util.List<si.yun.entity.SyComment>
      */
    @Override
    public List<Map<String,Object>> seComment(Integer forumid, Integer limitnum) {

        List<Map<String,Object>> syComments = dao.seComment(forumid, limitnum);
        KeyWordFilter.initPattern();

        for(Map<String,Object> map:syComments){
            String content = KeyWordFilter.doFilter2((String) map.get("content"));
            map.put("content",content);
        }

        return syComments;
    }

    /**
      * @Author : 评论删除
      * @Date : 2021/8/2 20:06
      * @Param : [cid]
      * @Return : int
      */
    @Override
    public int deComment(Integer cid) {
        int i = dao.deComment(cid);
        return i;
    }

    /**
      * @Author : 查询账号
      * @Date : 2021/8/2 21:26
      * @Param : [name, num]
      * @Return : si.yun.entity.SyUser
      */
    @Override
    public SyUser seUser(String name, String num) {
        SyUser syUser = dao.seUser(name, num);
        return syUser;
    }

    /**
      * @Author : 添加评论
      * @Date : 2021/8/2 21:39
      * @Param : [userid, id, title]
      * @Return : int
      */
    @Override
    public int inComment(Integer userid, Integer id, String title) {
        int i = dao.inComment(userid, id, title);
        return i;
    }

    /**
      * @Author : 类型查询
      * @Date : 2021/8/3 11:42
      * @Param : [type1]
      * @Return : java.lang.Integer
      */
    @Override
    public Integer SeActid(String type1) {
        Integer integer = dao.SeActid(type1);
        return integer;
    }


    /**
      * @Author : 文章添加
      * @Date : 2021/8/3 11:55
      * @Param : [title, content, typeid, userid]
      * @Return : int
      */

    @Override
    public int addCommentAct(String title,String actUrl, String content, Integer typeid, Integer userid,Integer details) {
        int i = dao.addCommentAct(title,actUrl,content, typeid ,userid,details);
        return i;
    }

    /**
      * @Author : 查询基本信息
      * @Date : 2021/8/4 14:48
      * @Param : [id]
      * @Return : java.util.Map<java.lang.String,java.lang.Object>
      */
    @Override
    public Map<String, Object> SeUserComment(Integer id) {
        Map<String, Object> stringObjectMap = dao.SeUserComment(id);
        return stringObjectMap;
    }

    /**
      * @Author : 课程树
      * @Date : 2021/8/4 16:55
      * @Param : [parentid]
      * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
      */
     @Override
    public List<Map<String, Object>> seCurriculumTree(Integer parentid,Integer categoryId) {

        String curriculumTree=String.format(CacheKeyManager.INDEX_CurriculumTree,parentid,categoryId);

         try {
             Object cacheObject=baseCache.getTenCacheBuild().get(curriculumTree,()->{
                 List<Map<String,Object>> ztreeNodes=new ArrayList<>();
                 Map<String,Object> map=new HashMap<>();
                 map.put("id",0);
                 map.put("name","选择分类类型");
                 map.put("open",true);
                 List<Map<String,Object>> children2=dao.seCurriculumTree(parentid);
                 for(Map<String,Object> c2:children2){

                     String str =(String) c2.get("name");;
                     if(str.length()>7){
                         String name=str.substring(0,7)+".....";
                         c2.put("name",name);
                     }else{
                         c2.put("name",str);
                     }

                     c2.put("open",true);
                     int id= (int) c2.get("id");
                     List<Map<String, Object>> maps = seManageDtreeOf(id,categoryId);
                     c2.put("children",maps);

                     if(c2.get("id").equals(categoryId)){
                         c2.put("checked",true);
                     }

                 }
                 map.put("children",children2);
                 ztreeNodes.add(map);
                 return ztreeNodes;
             });
             if(cacheObject instanceof List ){
                 List<Map<String, Object>> ztreeNodes= (List<Map<String, Object>>) cacheObject;
                 return  ztreeNodes;
             }
         } catch (Exception e) {
             e.printStackTrace();
         }

        return null;
    }


    public List<Map<String,Object>> seManageDtreeOf(int id,Integer categoryId){
        List<Map<String, Object>> children3 = dao.seCurriculumTree(id);
        if(children3!=null){
            for(Map<String, Object> c1:children3){

                String str =(String) c1.get("name");;
                if(str.length()>7){
                    String name=str.substring(0,7)+".....";
                    c1.put("name",name);
                }else{
                    c1.put("name",str);
                }

                c1.put("open",true);
                int id1= (int) c1.get("id");
                List<Map<String, Object>> maps = seManageDtreeOf(id1,categoryId);

                c1.put("children",maps);

                if(c1.get("id").equals(categoryId)) {
                    c1.put("checked", true);
                }
            }
        }
        return children3;

    }


    /**
      * @Author : 课程总数
      * @Date : 2021/8/4 19:37
      * @Param : []
      * @Return : int
      */
    @Override
    public int Secourse() {
        int secourse = dao.Secourse();
        return secourse;
    }

    /**
      * @Author : 已上架
      * @Date : 2021/8/4 19:38
      * @Param : []
      * @Return : int
      */
    @Override
    public int Sestatus() {
        int sestatus = dao.Sestatus();
        return sestatus;
    }

    /**
      * @Author : 未上架
      * @Date : 2021/8/4 19:39
      * @Param : []
      * @Return : int
      */
    @Override
    public int SestatusNo() {
        int i = dao.SestatusNo();
        return i;
    }

    /**
      * @Author : 待审核
      * @Date : 2021/8/4 19:39
      * @Param : []
      * @Return : int
      */
    @Override
    public int Secstatus() {
        int secstatus = dao.Secstatus();
        return secstatus;
    }
    /**
      * @Author : 未通过
      * @Date : 2021/8/4 19:40
      * @Param : []
      * @Return : int
      */
    @Override
    public int SecstatusNo() {
        int i = dao.SecstatusNo();
        return i;
    }

    /**
      * @Author : 树节点删除
      * @Date : 2021/8/4 20:09
      * @Param : [id]
      * @Return : int
      */
    @Override
    public int deCurriculumTree(Integer id) {
        int i = dao.deCurriculumTree(id);
        String curriculumTree=String.format(CacheKeyManager.INDEX_CurriculumTree);
        if(i>0){
            baseCache.invalidate(curriculumTree);
        }
        return i;
    }

    /**
      * @Author : 树节点的添加
      * @Date : 2021/8/4 20:20
      * @Param : [name, parentId]
      * @Return : int
      */
    @Override
    public int AddCurriculumTree(SyCourseClass sc) {
        int i = dao.AddCurriculumTree(sc);
        String curriculumTree=String.format(CacheKeyManager.INDEX_CurriculumTree);
        if(i>0){
            baseCache.invalidate(curriculumTree);
        }
        return i;
    }

    /**
      * @Author : 树节点修改
      * @Date : 2021/8/4 20:27
      * @Param : [Newname, id]
      * @Return : int
      */
    @Override
    public int UpCurriculumTree(SyCourseClass sc) {
        int i = dao.UpCurriculumTree(sc);
        String curriculumTree=String.format(CacheKeyManager.INDEX_CurriculumTree);
        if(i>0){
            baseCache.invalidate(curriculumTree);
        }
        return i;
    }

    /**
      * @Author : 课程表
      * @Date : 2021/8/5 9:37
      * @Param : [courseName, classid, coursenprice]
      * @Return : java.util.List<si.yun.entity.SyCourse>
      */
    @Override
    public List<SyCourse> SeCurriculumTab(String courseName, Integer classid, Integer coursenprice, String intro, Integer status, Integer cstatus, Integer num, Integer userId) {
        List<SyCourse> syCourses = dao.SeCurriculumTab(courseName, classid, coursenprice,intro,status,cstatus,num,userId);

        //前台课程
        syCourses.addAll((Collection<? extends SyCourse>) dao.SeCurriculumTabBefore(courseName, classid, coursenprice,intro,status,cstatus,num,userId));
        return syCourses;
    }

    /**
      * @Author : 审核查询
      * @Date : 2021/8/5 16:09
      * @Param : [courseid]
      * @Return : java.util.List<si.yun.entity.SyCourseRecord>
      */
     @Override
    public List<Map<String,Object>> SeRecord(Integer courseid,Integer type) {
        List<Map<String,Object>> syCourseRecords = dao.SeRecord(courseid,type);
        return syCourseRecords;
    }


    /**
      * @Author : 课程删除
      * @Date : 2021/8/5 17:26
      * @Param : [cid]
      * @Return : int
      */
    @Override
    public int delectCourseTable(Integer cid,String url,Integer mid) {

        //添加操作日志
        SyOperationLog log=new SyOperationLog();
        log.setTablename("课程列表");
        log.setType(3);
        log.setMid(mid);
        log.setRemark("删除课程");
        int addOperationLog = addOperationLog(log);

        //获取预览图片删除
        List<Map<String, Object>> maps = selMicrocircle(2, cid);
        if(maps.size()>0){
            for(Map<String, Object> map:maps){
                testAliUpload.delete((String) map.get("picture_url"));
            }
            int num = delMicrocircle(cid, 2);
        }

        int i = dao.delectCourseTable(cid);

        //删除服务器主图片
        testAliUpload.delete(url);
        return i;
    }

    /**
      * @Author : 课程详情
      * @Date : 2021/8/6 9:21
      * @Param : [courseid]
      * @Return : si.yun.entity.SyCourse
      */
    @Override
    @Transactional
    public SyCourseTab SeCourseView(Integer courseid) {
        SyCourseTab syCourse = dao.SeCourseView(courseid);
        
        //课程视频路径拼接
        syCourse.setCourseUrl(path1+syCourse.getCourseUrl());

        //查询预览图
        List<Map<String,Object>> list = selMicrocircleImg(2, courseid);
        syCourse.setMicrocircleImg(list);
        return syCourse;
    }

    /*
     * @Description : 查询预览图
     * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @Date : 2021/12/14 15:13
     */
   @Transactional
    public List<Map<String,Object>> selMicrocircleImg(Integer type,Integer id){
        List<Map<String,Object>> list = syCommentMapper.selMicrocircleImg(type, id);
        for(Map<String,Object> map:list){
            map.put("picture_url",path1+map.get("picture_url"));
        }
        return list;
    }

    /**
      * @Author : 课程修改
      * @Date : 2021/8/6 11:34
      * @Param : [courseid, classid, courseName, intro]
      * @Return : int
      */
     @Override
     @Transactional
    public int upCourses(SyCourse sc, List list, List list2, List<Map<String,Object>> list3) {
        int upcourse = dao.Upcourse(sc);

        //删除预览图
        int delMicrocircleImg=1;
        if(list.size()>0){
            int num=delMicrocircleImg(list);
            if(num==0){
                delMicrocircleImg=0;
            }
        }

        //添加预览图
        int addMicrocircleImg=1;
        if(list2.size()>0){
            int num = addMicrocircleImg(list2);
            if(num==0){
                addMicrocircleImg=0;
            }
        }

         //删除服务器图片
         if(list3.size()>0){
             for(Map<String,Object> map:list3){
                 String delImg = (String) map.get("delImg");
                 testAliUpload.delete((String) map.get("delImg"));
             }
         }

         //添加操作日志
         SyOperationLog log=new SyOperationLog();
         log.setTablename("课程列表");
         log.setType(4);
         log.setMid(sc.getCreateId());
         log.setRemark("修改课程");
         int addOperationLog = addOperationLog(log);


        Map<String,Object> map=new HashMap<>();
        map.put("logId",sc.getCourseId());
        map.put("price",sc.getCoursePrice());
        map.put("nprice",sc.getCourseNprice());
        map.put("type",2);
        map.put("createId",sc.getCreateId());
        int num = addLog(map);

        if(upcourse==0 || num==0 || delMicrocircleImg==0 || addMicrocircleImg==0 ||addOperationLog==0){
            throw new RuntimeException();
        }
        int sum=upcourse+num+delMicrocircleImg+addMicrocircleImg+addOperationLog;
        return sum;
    }

    /*添加操作日志
     * @Description : 
     * @Return : int
     * @Date : 2022/1/5 9:42
     */
    @Transactional
    public int addOperationLog(SyOperationLog log){
        int num = personnelMapper.addOperationLog(log);
        return num;
    }
    /*
     * @Description : 删除预览图
     * @Return : int
     * @Date : 2021/12/14 14:14
     */
    @Transactional
    public int delMicrocircleImg(List list){
        int num= dao.delMicrocircleImg(list);
        return num;
    }

    /*
     * @Description : 添加预览图
     * @Return : int
     * @Date : 2021/12/14 14:16
     */
    @Transactional
    public int addMicrocircleImg(List list){
        int num= dao.addMicrocircleImg(list);
        return num;
    }


    /*
     * @Description : 添加日志
     * @Return : int
     * @Date : 2021/12/14 14:13
     */
    @Transactional
    public int addLog(Map<String,Object> map){
        int num = syCourseMapper.addLog(map);
        return num;
    }


    /**
      * @Author : 课程评论
      * @Date : 2021/8/6 15:44
      * @Param : []
      * @Return : java.util.List<si.yun.entity.SyComment>
      */
    @Override
    public List<SyComment> setComment(String beforeId, String beforeName, String content) {
        List<SyComment> syComments = dao.setComment(beforeId,beforeName,content);
        return syComments;
    }

    /**
      * @Author : 删除评论
      * @Date : 2021/8/6 17:09
      * @Param : [commentid]
      * @Return : int
      */
    @Override
    public int DeCommentTab(Integer commentid) {
        int i = dao.DeCommentTab(commentid);
        return i;
    }

    /**
      * @Author : 课程评论详情
      * @Date : 2021/8/9 11:47
      * @Param : [commentid]
      * @Return : java.util.List<si.yun.entity.SyCourse>
      */
    @Override
    public SyCourse SeCommentCourse(Integer commentid) {
        SyCourse syCourses = dao.SeCommentCourse(commentid);
        return syCourses;
    }

    /**
      * @Author : 课程评论
      * @Date : 2021/8/9 13:55
      * @Param : [forumid, limitnum]
      * @Return : java.util.List<si.yun.entity.SyComment>
      */
    @Override
    public List<SyComment> SeCommentlimit(Integer forumid, Integer limitnum) {
        List<SyComment> syComments = dao.SeCommentlimit(forumid, limitnum);
        return syComments;
    }

    /**
      * @Author : 课程详情
      * @Date : 2021/8/9 15:24
      * @Param : [courseid]
      * @Return : si.yun.entity.SyCourse
      */
    @Override
    public SyCourse SeCourseText(Integer courseid) {
        SyCourse syCourse = dao.SeCourseText(courseid);
        return syCourse;
    }

    /**
      * @Author : 查看账号是否存在
      * @Date : 2021/8/10 11:20
      * @Param : [name]
      * @Return : si.yun.entity.SyBeforeUser
      */
    @Override
    public SyBeforeUser SeBefore(String name) {
        SyBeforeUser syBeforeUser = dao.SeBefore(name);
        return syBeforeUser;
    }

    /**
      * @Author : 添加评论
      * @Date : 2021/8/10 11:37
      * @Param : [userid, id, title]
      * @Return : int
      */
    @Override
    public int AddCommentCourse(Integer userid, Integer id, String title) {
        int i = dao.AddCommentCourse(userid, id, title);
        return i;
    }

    /**
      * @Author : 微圈审核
      * @Date : 2021/8/24 9:44
      * @Param : []
      * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
      */
    @Override
    public List<Map<String, Object>> SeForumExam(String actName,Integer userId,String accMoney) {
        List<Map<String, Object>> maps = dao.SeForumExam(actName,userId,accMoney);
        return maps;
    }

    /**
      * @Author : 审核修改
      * @Date : 2021/8/25 16:51
      * @Param : [detaId]
      * @Return : int
      */
    @Override
    public int updateForum(Integer detaId,Integer id) {
        int i = dao.updateForum(detaId,id);
        return i;
    }
    /**
      * @Author : 课程导入
      * @Date : 2021/9/10 11:52
      * @Param : [sycourse]
      * @Return : int
      */
    @Override
    public int addSyCourse(List<SyCourseTab> sycourse) {
        int i = dao.addSyCourse(sycourse);
        return i;
    }

    /**
      * @Author : 微圈评论
      * @Date : 2021/9/3 22:23
      * @Param : [comName, userId, accId]
      * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
      */
    @Override
    public List<Map<String, Object>> MicroreviewTab(String comName, String userId, String accId) {
        List<Map<String, Object>> maps = dao.MicroreviewTab(comName, userId, accId);
        return maps;
    }

    /**
      * @Author : 评论隐藏
      * @Date : 2021/9/10 8:46
      * @Param : [commentid]
      * @Return : int
      */
    @Override
    public int hideComment(Integer commentid) {
        int i = dao.hideComment(commentid);
        return i;
    }

    /**
      * @Author : 用户查询
      * @Date : 2021/9/14 9:00
      * @Param : [account, password]
      * @Return : java.lang.Integer
      */
    @Override
    public Integer seUserContent(String account, String password) {
        Integer integer = dao.seUserContent(account, password);
        return integer;
    }

    /**
      * @Author : 修改课程状态
      * @Date : 2021/9/27 14:28
      * @Param : [courseId, status]
      * @Return : int
      */
    @Override
    public int updateStatus(Integer courseId, Integer status) {
        int i = dao.updateStatus(courseId, status);
        return i;
    }


/*
    * @Description : 查询课程详情
    * @Return : java.util.Map<java.lang.String,java.lang.Object>
    * @Date : 2021/10/13 9:46
    */
    @Override
    public Map<String,Object>  selCourseText(Integer id) {
        Map<String,Object> map = dao.selCourseText(id);
        return map;
    }

/*
    * @Description : 查询课程日志
    * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
    * @Date : 2021/10/15 10:57
    */
    @Override
    public List<Map<String, Object>> selCourseLog(Integer type, Integer logId) {
        List<Map<String, Object>> list = dao.selCourseLog(type, logId);
        return list;
    }


   /*
    * @Description : 查询所有微圈分类赋值给下拉菜单
    * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
    * @Date : 2021/11/16 11:52
    */
    @Override
    public List<Map<String, Object>> selActicleCategraySelect() {
        List<Map<String, Object>> list = syActicleCategrayMapper.selActicleCategraySelect();
        return list;
    }

    /*
     * @Description : 树节点查询
     * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @Date : 2021/11/17 20:33
     */
    @Override
    public List<Map<String, Object>> seCourseClass(Integer parentid,Integer categoryId) {

            List<Map<String,Object>> ztreeNodes=new ArrayList<>();
            Map<String,Object> map=new HashMap<>();
            map.put("id",0);
            map.put("name","选择分类类型");
            map.put("open",true);
            List<Map<String,Object>> children2=dao.seCurriculumTree(parentid);
            for(Map<String,Object> c2:children2){

                String str =(String) c2.get("name");;
                if(str.length()>7){
                    String name=str.substring(0,7)+".....";
                    c2.put("name",name);
                }else{
                    c2.put("name",str);
                }

                c2.put("open",true);
                int id= (int) c2.get("id");
                List<Map<String, Object>> maps = seManageDtreeOf(id,categoryId);
                c2.put("children",maps);

                if(c2.get("id").equals(categoryId)){
                    c2.put("checked",true);
                }

            }
            map.put("children",children2);
            ztreeNodes.add(map);
            return ztreeNodes;
    }

    /*
     * @Description : 个人微圈管理
     * @Return : java.util.List<si.yun.entity.SyForum>
     * @Date : 2021/11/22 16:17
     */
    @Override
    public List<SyForum> seForumPrivate(Map<String,Object> map) {
        List<SyForum> syForums = dao.seForumPrivate(map);
        return syForums;
    }

    /*
     * @Description : 修改课程状态
     * @Return : int
     * @Date : 2021/11/29 14:22
     */
    @Override
    public int updCstatus(Integer cstatus, Integer updateId, Integer id) {
        int num = dao.updCstatus(cstatus, updateId, id);
        return num;
    }
    
    /*
     * @Description : 删除时查找预览图，进行图片服务器删除
     * @Return : java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @Date : 2022/1/7 11:42
     */
    @Transactional
    public List<Map<String,Object>> selMicrocircle(Integer type,Integer id){
        List<Map<String, Object>> list = dao.selMicrocircle(type, id);
        return list;
    }

    /*
     * @Description : 删除预览图数据
     * @Return : int
     * @Date : 2022/1/7 11:52
     */
    @Transactional
    public int  delMicrocircle(Integer id,Integer type){
        int num = dao.delMicrocircle(id, type);
        return num;
    }
}
